#include <mips/regdef.h>

	.text
	.align	2
	.globl	SumarTodosLosElementos

SumarTodosLosElementos:
	# Armo el stackframe, como es leaf no guardo el ra
	subu	sp,sp,24
	sw	$fp,20(sp)
	sw	gp,16(sp)
	move	$fp,sp

	# Por ser callee, debo guardar los argumentos de la caller
	sw	a0,24($fp)	# *topePila
	sw	a1,28($fp)	# tamanioPila
	sw	a2,32($fp)	# *cantidadElementos
	sw	a3,36($fp)	# *resultadoSuma

	addi	t0, zero, 0	# t0 = 0 (i, Variable del ciclo)
	lw	t1,32($fp)	# t1 = *cantidadElementos
	lw	t1,0(t1)	# t1 = cantidadElementos

loop:
	beq	t0,t1,finbien	# Si recorrí todos los elementos, termino
	lw	t2,36($fp)	# t2 = *resultadoSuma
	sll	t4,t0,3		# t4 = i*8
	lw	t5,24($fp)	# t5 = *topePila
	addu	t5,t5,t4	# topePila + 8*i
	l.d	$f2,0(t2)	# f2 = resultadoSuma
	l.d	$f0,0(t5)	# f0 = *(topePila + 8*i)
	add.d	$f0,$f2,$f0	# f0 = resultadoSuma
	s.d	$f0,0(t2)	# Guardo el resultadoSuma
	mfc1	t6, $f31	# Obtengo el FCSR (Floating point Control and Status Register)
	andi	t7, t6, 16	# Máscara para chequear overflow
	bne	t7, zero, of	# Si hay overflow, salgo
	andi	t7, t6, 8	# Máscara para chequear underflow
	bne	t7, zero, uf	# Si hay underflow, salgo	
	addu	t0,t0,1		# i++;
	b	loop		# loopeo

of:
uf:
	addu	v0,zero,0	# Error, devuelvo 0
	b	fin

finbien:
	addu	v0,zero,1	# devuelvo 1

fin:	move	sp,$fp
	lw	gp,16(sp)
	lw	$fp,20(sp)
	addu	sp,sp,24
	j	ra
